*&---------------------------------------------------------------------*
*& Report ZEX_LISTING_66                                               *
*&---------------------------------------------------------------------*
*& Created By: James Wood (james.wood@bowdarkconsulting.com)           *
*& Created On: 12/12/2008                                              *
*& Purpose:    This program shows how classes in an inheritance tree   *
*&             can be used interchangably in a program using dynamic   *
*&             method call binding.                                    *
*&---------------------------------------------------------------------*
REPORT zex_listing_66.

*----------------------------------------------------------------------*
*       CLASS lcl_animal DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_animal DEFINITION ABSTRACT.

  PUBLIC SECTION.
    METHODS: get_type ABSTRACT,
             speak ABSTRACT.

ENDCLASS.                    "lcl_animal DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_cat  DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_cat DEFINITION
      INHERITING FROM lcl_animal.

  PUBLIC SECTION.
    METHODS: get_type REDEFINITION,
             speak REDEFINITION.

ENDCLASS.                    "lcl_cat  DEFINITIO

*----------------------------------------------------------------------*
*       CLASS lcl_cat IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_cat IMPLEMENTATION.

  METHOD get_type.
    WRITE: 'Cat'.
  ENDMETHOD.                    "get_type

  METHOD speak.
    WRITE: 'Meow'.
  ENDMETHOD.                    "speak

ENDCLASS.                    "lcl_cat IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS lcl_dog  DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_dog DEFINITION
      INHERITING FROM lcl_animal.

  PUBLIC SECTION.
    METHODS: get_type REDEFINITION,
             speak REDEFINITION.

ENDCLASS.                    "lcl_dog  DEFINITIO

*----------------------------------------------------------------------*
*       CLASS lcl_dog IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_dog IMPLEMENTATION.

  METHOD get_type.
    WRITE: 'Dog'.
  ENDMETHOD.                    "get_type

  METHOD speak.
    WRITE: 'Bark'.
  ENDMETHOD.                    "speak

ENDCLASS.                    "lcl_dog IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS lcl_see_and_say DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_see_and_say DEFINITION.

  PUBLIC SECTION.
    CLASS-METHODS:
      play IMPORTING im_animal
                TYPE REF TO lcl_animal.

ENDCLASS.                    "lcl_see_and_say DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_see_and_say IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_see_and_say IMPLEMENTATION.

  METHOD play.
    WRITE: 'The'.
    CALL METHOD im_animal->get_type.
    WRITE: 'says'.
    CALL METHOD im_animal->speak.
  ENDMETHOD.                    "play

ENDCLASS.                    "lcl_see_and_say IMPLEMENTATION

*----------------------------------------------------------------------*
* START-OF-SELECTION Event Module                                      *
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM test_see_and_say.

*&---------------------------------------------------------------------*
*&      Form  test_see_and_say
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM test_see_and_say.

* Local Data Declarations:
  DATA: lr_cat TYPE REF TO lcl_cat,
        lr_dog TYPE REF TO lcl_dog.

* Test the See-and-Say with a cat:
  CREATE OBJECT lr_cat.
  CALL METHOD lcl_see_and_say=>play
    EXPORTING
      im_animal = lr_cat.

  NEW-LINE.

* Test the See-and-Say with a dog:
  CREATE OBJECT lr_dog.
  CALL METHOD lcl_see_and_say=>play
    EXPORTING
      im_animal = lr_dog.

ENDFORM.                    "test_see_and_say